package com.zhouheng.springbootjpa.enums;

import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * 最新资料的数据类型
 *
 * @author LeoRmAo
 * @date 20181007 10:14:08
 * @since v1.0
 */
public enum LatestDataTypeEnum {

    /**
     * NCEP_DAILY ncep逐日数据
     */
    NCEP_DAILY("020001", "NCEP逐日", DataProductEnum.NCEP_DAILY),
    /**
     * NCEP_MONTHLY 描述此枚举常量
     */
    NCEP_MONTHLY("020002", "NCEP逐月", DataProductEnum.NCEP_MONTHLY),
    /**
     * CFSV_DAILY 描述此枚举常量
     */
    CFSV_DAILY("020003", "CFSV逐日"),
    /**
     * CFSV_MONTHLY 描述此枚举常量
     */
    CFSV_MONTHLY("020004", "CFSV逐月"),
    /**
     * DERF_DAILY 描述此枚举常量
     */
    DERF_DAILY("020005", "DERF2.0逐日"),
    /**
     * CIMISS_DAILY 描述此枚举常量
     */
    CIMISS_DAILY("020006","CIMISS逐日"),
    /**
     * CIMISS_MONTHLY 描述此枚举常量
     */
    CIMISS_MONTHLY("020007","CIMISS逐月"),
    /**
     * BCC_DAILY 描述此枚举常量
     */
    BCC_DAILY("020008","BCC逐日"),
    /**
     * BCC_MONTHLY 描述此枚举常量
     */
    BCC_MONTHLY("020009","BCC逐月"),
    /**
     * EC_WEEKLY 描述此枚举常量
     */
    EC_WEEKLY("020010","EC逐周"),
    /**
     * EC_MONTHLY 描述此枚举常量
     */
    EC_MONTHLY("020011","EC逐月");

    /**
     * dataType 数据类型
     */
    private String dataType;

    /**
     * dataName 数据名称
     */
    private String dataName;

    /**
     * dataProductEnums 描述此字段
     */
    private List<ProductTypeEnum> productTypeEnums;


    /**
     * 描述该构造方法实现的功能
     *
     * @param dataType 描述此参数
     * @param dataName 描述此参数
     * @author LeoRmAo
     * @date 20181007 10:14:08
     * @since v1.0
     */
    LatestDataTypeEnum(String dataType, String dataName) {
        this.dataType = dataType;
        this.dataName = dataName;
    }

    /**
     * 描述该构造方法实现的功能
     *
     * @param dataType         描述此参数
     * @param dataName         描述此参数
     * @param dataProductEnum 描述此参数
     * @author LeoRmAo
     * @date 20181031 14:28:52
     * @since v1.0
     */
    LatestDataTypeEnum(String dataType, String dataName, DataProductEnum dataProductEnum) {
        this.dataType = dataType;
        this.dataName = dataName;
        this.productTypeEnums = dataProductEnum.getValues();
    }

    public List<ProductTypeEnum> getProductTypeEnums() {
        return productTypeEnums;
    }

    public void setProductTypeEnums(List<ProductTypeEnum> productTypeEnums) {
        this.productTypeEnums = productTypeEnums;
    }

    /**
     * 获取 data type.
     *
     * @return 返回 data type
     * @author LeoRmAo
     * @date 20181007 10:14:08
     * @since v1.0
     */
    public String getDataType() {
        return dataType;
    }

    /**
     * 设置 data type.
     *
     * @param dataType 描述此参数
     * @author LeoRmAo
     * @date 20181007 10:14:08
     * @since v1.0
     */
    public void setDataType(String dataType) {
        this.dataType = dataType;
    }

    /**
     * 获取 data name.
     *
     * @return 返回 data name
     * @author LeoRmAo
     * @date 20181007 10:14:08
     * @since v1.0
     */
    public String getDataName() {
        return dataName;
    }

    /**
     * 设置 data name.
     *
     * @param dataName 描述此参数
     * @author LeoRmAo
     * @date 20181007 10:14:08
     * @since v1.0
     */
    public void setDataName(String dataName) {
        this.dataName = dataName;
    }

    /**
     * 描述该枚举的用途
     *
     * @author LeoRmAo
     * @date 20181031 14:28:38
     * @since v1.0
     */
    public enum DataProductEnum {
        /**
         * NCEP_DAILY 描述此枚举常量
         */
        NCEP_DAILY(ProductTypeEnum.GH, ProductTypeEnum.MSLP, ProductTypeEnum.V_WIND, ProductTypeEnum.U_WIND, ProductTypeEnum.T),

        NCEP_MONTHLY(ProductTypeEnum.GH,ProductTypeEnum.MSLP,ProductTypeEnum.V_WIND,ProductTypeEnum.U_WIND,ProductTypeEnum.T,ProductTypeEnum.SST,ProductTypeEnum.OMEGA);

        /**
         * values 描述此字段
         */
        private List<ProductTypeEnum> values;

        /**
         * 描述该构造方法实现的功能
         *
         * @param values 描述此参数
         * @author LeoRmAo
         * @date 20181031 14:28:52
         * @since v1.0
         */
        DataProductEnum(ProductTypeEnum ... values) {
            this.values = Stream.of(values).collect(Collectors.toList());
        }

        /**
         * 获取 values.
         *
         * @return 返回 values
         * @author LeoRmAo
         * @date 20181031 14:28:52
         * @since v1.0
         */
        public List<ProductTypeEnum> getValues() {
            return values;
        }

        /**
         * 设置 values.
         *
         * @param values 描述此参数
         * @author LeoRmAo
         * @date 20181031 14:28:52
         * @since v1.0
         */
        public void setValues(List<ProductTypeEnum> values) {
            this.values = values;
        }
    }
}
